from article.models import Article
from django.shortcuts import get_object_or_404, redirect, render
from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_exempt
from django.contrib import messages
from .forms import CommentForm
from django.http import HttpResponse
from comments.models import Comment
from myaccount.models import User
import json


# 评论
@csrf_exempt
@require_POST
def AddcommentView(request):
    if request.is_ajax():
        data = request.POST
        # 评论内容
        new_content = data.get('arciclecomment')
        # 评论对象文章
        comment_post_ID = data.get('comment_post_ID')
        # 评论者
        author = data.get('comment_author')
        # 评论者网址
        # url = data.get('url', '')
        # 评论对象，父级对象，就是评论的是谁
        comment_parent = data.get('comment_parent')
        # 获取用户信息
        auser = User.objects.get(username=author)
        # 获取文章信息
        the_article = Article.objects.get(id=comment_post_ID)

        if comment_parent == '0':
            new_comment = Comment(author=auser, content=new_content, belong=the_article, parent=None, rep_to=None)
        else:
            comment_repto = data.get('comment_rep')
            repto = Comment.objects.get(id=comment_repto)
            parent = Comment.objects.get(id=comment_parent)
            new_comment = Comment(author=auser, content=new_content, belong=the_article, parent=parent, rep_to=repto)
        new_comment.save()

        success = {}
        success = {"success": "success"}
        return HttpResponse(json.dumps(success))

@require_POST   # 限制视图只能通过POST请求
def comment(request, article_id):
    # 先获取被评论的文章，因为后面需要把评论和被评论的文章关联起来。
    # 这里我们使用了 django 提供的一个快捷函数 get_object_or_404，
    # 这个函数的作用是当获取的文章（Post）存在时，则获取；否则返回 404 页面给用户。
    post = get_object_or_404(Article, pk=article_id)
    form = CommentForm(request.POST)

    if form.is_valid():
        # 检查到数据是合法的，调用表单的 save 方法保存数据到数据库，
        # commit=False 的作用是仅仅利用表单的数据生成 Comment 模型类的实例，但还不保存评论数据到数据库。
        comment = form.save(commit=False)

        # 将评论和被评论的文章关联起来。
        comment.post = post

        # 最终将评论数据保存进数据库，调用模型实例的 save 方法
        comment.save()
        messages.add_message(request,messages.SUCCESS,'评论发表成功!',extra_tags='success')
        # 重定向到 post 的详情页，实际上当 redirect 函数接收一个模型的实例时，它会调用这个模型实例的 get_absolute_url 方法，
        # 然后重定向到 get_absolute_url 方法返回的 URL。
        return redirect(post.get_abstruct_url())

    # 检查到数据不合法，我们渲染一个预览页面，用于展示表单的错误。
    # 注意这里被评论的文章 post 也传给了模板，因为我们需要根据 post 来生成表单的提交地址。
    context = {
        'post': post,
        'form': form,
    }
    messages.add_message(request,messages.ERROR,'评论发表失败！请修改表单中的错误后重新提交。',extra_tags='danger')
    return render(request, 'comments/previews.html', context=context)